package com.ruoyi.blockchain;

import java.security.*;

/**
 * 钱包类 - 管理用户的密钥对和交易创建
 */
public class Wallet {
    private PrivateKey privateKey;  // 私钥，用于签名交易
    private PublicKey publicKey;     // 公钥，作为用户地址

    /**
     * 构造函数 - 初始化钱包并生成密钥对
     */
    public Wallet() {
        generateKeyPair();
    }

    /**
     * 生成密钥对
     */
    private void generateKeyPair() {
        try {
            // 使用RSA算法生成密钥对（Java内置）
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            keyGen.initialize(2048);  // 2048位密钥长度
            
            KeyPair keyPair = keyGen.generateKeyPair();
            privateKey = keyPair.getPrivate();
            publicKey = keyPair.getPublic();
        } catch (Exception e) {
            throw new RuntimeException("生成密钥对失败", e);
        }
    }

    /**
     * 创建并签署交易
     * @param recipient 接收方公钥
     * @param value 交易金额
     * @param blockchain 当前区块链引用，用于检查余额
     * @return 已签名的交易对象
     */
    public Transaction createTransaction(PublicKey recipient, double value, Blockchain blockchain) {
        // 检查余额是否足够
        double balance = blockchain.getBalanceOfPublicKey(publicKey);
        if (balance < value) {
            System.out.println("余额不足，无法创建交易。余额: " + balance + ", 尝试转账: " + value);
            return null;
        }

        // 创建交易
        Transaction newTransaction = new Transaction(publicKey, recipient, value);
        
        // 使用私钥签名交易
        newTransaction.generateSignature(privateKey);
        
        return newTransaction;
    }

    /**
     * 获取钱包余额
     * @param blockchain 当前区块链引用
     * @return 钱包余额
     */
    public double getBalance(Blockchain blockchain) {
        return blockchain.getBalanceOfPublicKey(publicKey);
    }

    /**
     * 获取钱包地址（公钥的字符串表示）
     * @return 钱包地址
     */
    public String getAddress() {
        return Transaction.getStringFromKey(publicKey);
    }

    /**
     * 获取公钥
     * @return 公钥
     */
    public PublicKey getPublicKey() {
        return publicKey;
    }

    /**
     * 获取私钥
     * @return 私钥
     */
    public PrivateKey getPrivateKey() {
        return privateKey;
    }

    /**
     * 导入已有密钥对
     * @param privateKey 私钥
     * @param publicKey 公钥
     */
    public void importKeyPair(PrivateKey privateKey, PublicKey publicKey) {
        this.privateKey = privateKey;
        this.publicKey = publicKey;
    }

    @Override
    public String toString() {
        return "Wallet{" +
                "address='" + getAddress().substring(0, 10) + "...'" +
                '}';
    }
}